// 版权归Go作者所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 此文件包含处理模板选项的代码。

package template

import "strings"

// missingKeyAction定义如何使用不存在的键对映射进行索引。
type missingKeyAction int

const (
	mapInvalid   missingKeyAction = iota // 返回无效的反射。价值
	mapZeroValue                         // 返回map元素的零值。
	mapError                             // 出错
)

type option struct {
	missingKey missingKeyAction
}

// 选项设置模板的选项。选项由
// 字符串描述，可以是简单字符串，也可以是“key=value”。在
// 选项字符串中最多有一个等号。如果选项字符串
// 无法识别或无效，则选项会失效。
// 
// 已知选项：
// 
// missingkey:如果映射是
// 使用映射中不存在的密钥进行索引，则控制执行期间的行为。
// “missingkey=default”或“missingkey=invalid”
// /默认行为：不执行任何操作并继续执行。
// 如果打印，索引操作的结果是字符串
// “<no value>”。
// “missingkey=zero”
// 该操作返回映射类型元素的零值。
// “missingkey=error”
// 执行会立即停止，出现错误。
// 
func (t *Template) Option(opt ...string) *Template {
	t.init()
	for _, s := range opt {
		t.setOption(s)
	}
	return t
}

func (t *Template) setOption(opt string) {
	if opt == "" {
		panic("empty option string")
	}
	// key=value 
	if key, value, ok := strings.Cut(opt, "="); ok {
		switch key {
		case "missingkey":
			switch value {
			case "invalid", "default":
				t.option.missingKey = mapInvalid
				return
			case "zero":
				t.option.missingKey = mapZeroValue
				return
			case "error":
				t.option.missingKey = mapError
				return
			}
		}
	}
	panic("unrecognized option: " + opt)
}
